springMVC实现不经DispatcherServlet,过滤html

   前提:新的微信端项目。要求是访问的时候需要用户登录。登录需要跳转到微信Auth2.0去获取用户信息。

  一般登录拦截的操作都是在applicationContext.xml配置一个拦截器。如下面这样

    
        
    

  在这个拦截器中要求用户登录(存在session中)。

if(session.getAttribute("loginproperties") == null){
         response.sendRedirect(StringUtil.authUrl(request.getScheme()+"://"+request.getServerName()+request.getRequestURI()));
            return false;
        }

但是现在有个问题是,我们的拦截都是进了DispatcherServlet,如果需要在html这种静态资源之前增加权限拦截,那么有个很蛋疼的事情就是,因为springMVC会根据你的链接去动态匹配对应的handler,如果你需要跳转到不同的静态页面,那么你每写一个静态页面,就需要增加一个跳转,
return "/test/a" ;

这样既繁琐,又增加了服务器的压力。那有没有方法可以不进入dispatchServlet,但是可以对静态页面进行拦截,当没有权限访问的时候,要求用户登录呢?

答案是有的。

就是过滤器。

package com.common.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.filter.OncePerRequestFilter;
import com.common.util.StringUtil;

/**
 * Servlet Filter implementation class LoginFilter
 */
public class LoginFilter extends OncePerRequestFilter {

    /**
     * Default constructor. 
     */
    public LoginFilter() {
        // TODO Auto-generated constructor stub
    }

    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        // TODO Auto-generated method stub
        // place your code here

        // pass the request along the filter chain
        System.out.println("come hiere");
        HttpSession session = request.getSession();
if(null==session.getAttribute("openid")&&(null==request.getParameter("code")||"".equals(request.getParameter("code").trim())))
        { response.sendRedirect(StringUtil.authUrl(request.getScheme()+"://"+request.getServerName()+request.getRequestURI()));
            return;
        }
        chain.doFilter(request, response);
    }

}
然后在web.xml中配置

 
  LoginFilter
  com.common.filter.LoginFilter
 

 
    LoginFilter
    *.html
 

就可以在访问每一个html文件之前,要求用户先登录,且无需进入到dispathServlet中折腾了。

 

你可能感兴趣的:(java)