javaweb如何设置非登录状态下不允许访问静态资源文件?

在一个SSM框架的javaweb项目中,需要访问到服务器中的pdf文件。

当前访问pdf文件实现方式:

Tomcat配置(server.xml):

<Context crossContext="true" path="/pdf" docBase="/var/www/html/pdf" reloadable="true"/>
浏览器访问方式:
http://cloud.xxxxx.cn/pdf/测试文件.pdf

但是当前实现方式在非登录条件下直接浏览器输入地址也能访问到静态文件,如何给该静态资源文件的访问加上登录状态过滤?即登录状态下该地址才能访问到pdf文件。

阅读 7k
3 个回答

您好,根据你描述的情况,应该是想让所有的资源访问都加上登录认证,简单的,可以采用Servlet的Filter接口来实现,最近我刚好也写了一个类似的例子,你可以参考一下:
https://segmentfault.com/a/11...

也可以写个拦截器Interceptor, 在 preHandler 方法里验证是否是登录状态下访问的

更新:
该方法过滤器过滤规则(/pdf/*)与server.xml配置中的静态资源路径(/pdf)冲突,暂无解决方法,后面解决后再更新


学到一个解决思路,通过Filter过滤器解决。

创建一个Filter:

package com.plt.filter;

import org.apache.shiro.SecurityUtils;

public class PDFFilter implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    /*
     * 访问pdf文件时的登录状态过滤
     * */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //过滤规则内容
        HttpServletRequest req = (HttpServletRequest) request;
        String user_name = (String) SecurityUtils.getSubject().getPrincipal();  //shiro框架下的当前登录用户名获取
        if(user_name != null) {
            chain.doFilter(request, response);
        }else {
            req.getRequestDispatcher("/PDFFilter").forward(request, response);    //转发至一个get请求的接口处理 此为get请求
        }
    }

    @Override
    public void destroy() {}
}

在web.xml中将该过滤器加入配置方案:

<!-- 过滤pdf静态文件的访问 -->
    <filter>
        <filter-name>PDFFilter</filter-name>
        <filter-class>com.plt.filter.PDFFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>PDFFilter</filter-name>
        <url-pattern>/pdf/*</url-pattern>
    </filter-mapping>

controller层中对于过滤器拦截转发后的处理:

/*
     * 预览pdf报告时若非登录状态过滤器处理时转发过来的接收器
     */
    @RequestMapping(value = "/PDFFilter", produces = "text/html;charset=UTF-8", method = RequestMethod.GET)
    @ResponseBody
    public String PDFFilter() {
        return "登录状态非法,请核对登录状态!";
    }

测试结果:
image.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题