下午想在jsp页面下实现css与js文件的导入,结果出了一点小问题。
首先,js文件,css文件访问不到的问题,之所以访问不到,在于springboot项目在默认情况下也是会对css,js文件下是不会放行的,具体放行的执行类如下:
package com.bo.config;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.servlet.DispatcherType;
import java.util.ArrayList;
import java.util.List;
/**
* Created by dell-3020 on 2017/8/15.
*/
@Configuration
public class WebConfig {
@Bean
FilterRegistrationBean tokenFilter() {
FilterRegistrationBean filterReg = new FilterRegistrationBean(new TokenFilter());
//优先级
filterReg.setOrder(70);
filterReg.setDispatcherTypes(DispatcherType.REQUEST);
//匹配路径
List<String> urlPatterns = new ArrayList<>();
// urlPatterns.add("/*");
filterReg.addUrlPatterns("/*");
filterReg.addInitParameter("exclusions","*.js,*.css");
// filterReg.setUrlPatterns(urlPatterns);
System.out.println("====来了");
return filterReg;
}
}
package com.bo.config;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* <br>类 名: TokenFilter
* <br>描 述: TODO
* <br>作 者: lipeng
* <br>创 建: 2018/9/29 17:32
* <br>版 本:v1.0.0
* <br>
* <br>历 史: (版本) 作者 时间 注释
*/
public class TokenFilter implements Filter {
public static final String PARAM_NAME_EXCLUSIONS = "exclusions";
private Set<String> excludesPattern;
protected String contextPath;
protected PatternMatcher pathMatcher = new ServletPathMatcher();
public String getContextPath() {
return contextPath;
}
public void setContextPath(String contextPath) {
this.contextPath = contextPath;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
String param = filterConfig.getInitParameter(PARAM_NAME_EXCLUSIONS);
if (param != null && param.trim().length() != 0) {
this.excludesPattern = new HashSet(Arrays.asList(param.split("\\s*,\\s*")));
}
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest)servletRequest;
HttpServletResponse httpResponse = (HttpServletResponse)servletResponse;
TokenFilter.StatHttpServletResponseWrapper responseWrapper = new TokenFilter.StatHttpServletResponseWrapper(httpResponse);
String requestURI = this.getRequestURI(httpRequest);
if (this.isExclusion(requestURI)) {
//不过滤走
System.out.println("===不进过滤器");
filterChain.doFilter(servletRequest, servletResponse);
}else {
//这里是过滤方法
System.out.println("===进了过滤器");
filterChain.doFilter(servletRequest,servletResponse);
}
}
@Override
public void destroy() {
}
public boolean isExclusion(String requestURI) {
if (this.excludesPattern == null) {
return false;
} else {
if (this.contextPath != null && requestURI.startsWith(this.contextPath)) {
requestURI = requestURI.substring(this.contextPath.length());
if (!requestURI.startsWith("/")) {
requestURI = "/" + requestURI;
}
}
Iterator i$ = this.excludesPattern.iterator();
String pattern;
do {
if (!i$.hasNext()) {
return false;
}
pattern = (String)i$.next();
} while(!this.pathMatcher.matches(pattern, requestURI));
return true;
}
}
public static final class StatHttpServletResponseWrapper extends HttpServletResponseWrapper implements HttpServletResponse {
private int status = 200;
public StatHttpServletResponseWrapper(HttpServletResponse response) {
super(response);
}
@Override
public void setStatus(int statusCode) {
super.setStatus(statusCode);
this.status = statusCode;
}
public void setStatus(int statusCode, String statusMessage) {
super.setStatus(statusCode, statusMessage);
this.status = statusCode;
}
@Override
public void sendError(int statusCode, String statusMessage) throws IOException {
super.sendError(statusCode, statusMessage);
this.status = statusCode;
}
@Override
public void sendError(int statusCode) throws IOException {
super.sendError(statusCode);
this.status = statusCode;
}
@Override
public int getStatus() {
return this.status;
}
}
public String getRequestURI(HttpServletRequest request) {
return request.getRequestURI();
}
}
package com.bo.config;
/**
* <br>类 名: PatternMatcher
* <br>描 述: TODO
* <br>作 者: lipeng
* <br>创 建: 2018/9/29 18:56
* <br>版 本:v1.0.0
* <br>
* <br>历 史: (版本) 作者 时间 注释
*/
public interface PatternMatcher {
boolean matches(String var1, String var2);
}
package com.bo.config;
public class ServletPathMatcher implements PatternMatcher {
private static final ServletPathMatcher INSTANCE = new ServletPathMatcher();
public ServletPathMatcher() {
}
public static ServletPathMatcher getInstance() {
return INSTANCE;
}
public boolean matches(String pattern, String source) {
if (pattern != null && source != null) {
pattern = pattern.trim();
source = source.trim();
int start;
if (pattern.endsWith("*")) {
start = pattern.length() - 1;
if (source.length() >= start && pattern.substring(0, start).equals(source.substring(0, start))) {
return true;
}
} else if (pattern.startsWith("*")) {
start = pattern.length() - 1;
if (source.length() >= start && source.endsWith(pattern.substring(1))) {
return true;
}
} else if (pattern.contains("*")) {
start = pattern.indexOf("*");
int end = pattern.lastIndexOf("*");
if (source.startsWith(pattern.substring(0, start)) && source.endsWith(pattern.substring(end + 1))) {
return true;
}
} else if (pattern.equals(source)) {
return true;
}
return false;
} else {
return false;
}
}
}
这是我从一个哥们博客上荡下来的,亲测可用,资源被放行。
主要是后续我在开发者工具中发现了js文件被成功响应在network里面,但css并没有被响应,可是通过地址栏我却可以访问到它。
所以我的前端页面回显不出来样式,后来发现是我导入css的格式写错了,正确格式如下:
<link rel="stylesheet" type="text/css" href="/bootstrap/css/bootstrap.css"></link>
css就被导入到该页面中了。如下:
这个时候,样式便成功导入了,木有问题。