注解方式filter过滤器进行header 简单安全验证以及放过静态资源

起因:项目前台代码和后台代码未分离,临时设置一个简单的安全验证,需要对静态资源进行过滤。


import java.io.IOException;
import java.util.HashSet;
import java.util.Set;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;

import com.alibaba.druid.util.StringUtils;

@WebFilter(filterName = "loginFilter", value = "/*")
@Component
public class LoginFilter implements Filter {
    private static final String NAME = "x'x'x";  //header名称
    private static final String ERROR = "x'x'x x'x'x";  //错误返回
    private static final String VALUE = "x'x'x"; //header值

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        String uri = request.getRequestURI();//取到你访问的资源
        String loginToken = request.getHeader(NAME); //获取到对应名称header 的值
        if (uri.equals("/")) {  //静态资源默认访问路径在/下,所以放过
            filterChain.doFilter(servletRequest, servletResponse);
        }
        if (isStaticResource(uri)) {  //判断是否是静态资源
            filterChain.doFilter(servletRequest, servletResponse);
        }
        if (StringUtils.isEmpty(loginToken)) {  //验证token有没有
            response.sendError(404, ERROR);
            return;
        }
        if (!VALUE.equals(loginToken)) { //验证token是否正确
            response.sendError(404, ERROR);
            return;
        }
        filterChain.doFilter(servletRequest, servletResponse);  //放过
    }

    @Override
    public void destroy() {

    }

    private Set<String> staticResourceTypes = new HashSet<String>();

    {
        staticResourceTypes.add(".html");
        staticResourceTypes.add(".css");
        staticResourceTypes.add(".js");
        staticResourceTypes.add(".png");
        staticResourceTypes.add(".jpg");
        staticResourceTypes.add(".otf");
        staticResourceTypes.add(".eot");
        staticResourceTypes.add(".svg");
        staticResourceTypes.add(".ttf");
        staticResourceTypes.add(".woff");
        staticResourceTypes.add(".gif");
        staticResourceTypes.add(".ico");
        staticResourceTypes.add(".txt");
        staticResourceTypes.add(".gzip");
        staticResourceTypes.add(".xz");
        staticResourceTypes.add(".tar.gz");
        staticResourceTypes.add(".tar.bz2");
        staticResourceTypes.add(".jar");
        staticResourceTypes.add(".war");
        staticResourceTypes.add(".7z");
        staticResourceTypes.add(".tgz");
        staticResourceTypes.add(".gz");
        staticResourceTypes.add(".map");

    }

    public final boolean isStaticResource(String url) {

        boolean result = false;
        if (org.apache.commons.lang3.StringUtils.isBlank(url)) {
            return result;
        }
        int start = url.lastIndexOf(".");
        if (start < 0) {
            return result;
        }
        String prex = url.substring(start, url.length());
        return staticResourceTypes.contains(prex);
    }
}

如果你想要在HTML中使用的CSS和JS等静态文件能够被正常加载,可以通过配置服务器的过滤器(Filter)来实现。以下是一个示例: 1. 创建一个实现了 `javax.servlet.Filter` 接口的过滤器类,例如命名为 `StaticResourceFilter`。 ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class StaticResourceFilter implements Filter { @Override public void init(FilterConfig filterConfig) { // 初始化方法,可留空 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String requestURI = httpRequest.getRequestURI(); // 如果是以指定的文件扩展名结尾,则设置允许访问静态资源的响应头 if (requestURI.endsWith(".css") || requestURI.endsWith(".js")) { HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("Access-Control-Allow-Origin", "*"); } chain.doFilter(request, response); } @Override public void destroy() { // 销毁方法,可留空 } } ``` 2. 在应用的 `web.xml`(或者使用注解方式)中配置该过滤器。 ```xml <filter> <filter-name>StaticResourceFilter</filter-name> <filter-class>com.example.StaticResourceFilter</filter-class> </filter> <filter-mapping> <filter-name>StaticResourceFilter</filter-name> <url-pattern>*.css</url-pattern> </filter-mapping> <filter-mapping> <filter-name>StaticResourceFilter</filter-name> <url-pattern>*.js</url-pattern> </filter-mapping> ``` 上述配置中,我们通过 `<url-pattern>` 指定了要拦截的URL模式,这里使用通配符 `*.css` 和 `*.js` 分别匹配CSS和JS文件。在过滤器的 `doFilter` 方法中,我们判断请求的URI是否以指定的文件扩展名结尾,如果是,则设置允许访问静态资源的响应头 `Access-Control-Allow-Origin: *`。这样配置后,当HTML页面中引用到的CSS和JS文件被加载时,浏览器可以正常访问这些静态资源。 请注意,这只是一种简单方式来放行HTML中使用到的静态文件。具体的配置和实现方式可能因服务器和开发环境而异,请根据你的实际情况进行适当调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值