Olá pessoal, eu sou o repolho coberto de repolho.
Tecnologia : estrutura SSM, interceptador,
plano de fundo do filtro : quando estamos efetuando login ou registrando, não podemos solicitar acesso quando visitamos o restante do projeto. Existem duas maneiras de alcançá-lo. Uma é filtrar com filtro, mas Interceptar com interceptador
Página de login:
Página de registro:
Implementação específica do interceptador:
1. Em primeiro lugar, os detalhes de configuração de interceptor primavera-servlet.xml
'
如果有多个拦截器满足拦截处理的要求,则依据配置的先后顺序来执行
-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有的请求,这个必须写在前面,也就是写在【不拦截】的上面 -->
<mvc:mapping path="/**" />
<!-- 但是排除下面这些,也就是不拦截请求 -->
<mvc:exclude-mapping path="/login.jsp" />
<mvc:exclude-mapping path="/users/login.do" />
<mvc:exclude-mapping path="/users/register.do" />
<bean class="com.bzbs.interceptor.LoginInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
2. Crie uma classe para implementar a interface HandlerInterceptor
Escreva requisitos de negócios específicos no método postHandle (), o que precisa ser feito depois que a página for interceptada
public class LoginInterceptor implements HandlerInterceptor{
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// TODO Auto-generated method stub
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
//获取session 判断里面是否存有用户信心,没有则返回登录页面
HttpSession session=request.getSession();
Object user =session.getAttribute("user");
Object password =session.getAttribute("password");
if(user==null || password==null){
String url = request.getRequestURL().toString();
response.sendRedirect(request.getContextPath()+"/system/login.jsp?returnURL="+url);
return false;
}
return true;
}
}
Estou aqui para determinar se deve efetuar login. Se você já tiver efetuado login, poderá acessar diretamente a página bloqueada. Se não houver valor na sessão, continuará a colocá-la novamente na página de espera. Depois disso, o endereço original a ser acessado será emendado. Após o login, você pode acessá-lo diretamente, permitindo o acesso. A página é muito mais conveniente.
Aqui está a implementação do filtro:
1. Configure o conteúdo web.xml
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.bzbs.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
url-pattern é a página a ser filtrada, / * significa que todas as páginas devem ser bloqueadas; aqui você pode configurar a lista branca e a lista negra; como fazer isso não será descrito aqui
2. Crie uma classe para implementar a interface Filtro
/**
* @ClassName: LoginFilter
* @Description: 用拦截器没有作用,改变思路,用过滤器实现登录验证,假如没有登录则返回登录页面
* @author Lily
* @date 2020年3月11日
*/
public class LoginFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
//首先获取http对象
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)res;
//此处判断,先获得请求路径,然后对请求路径进行分析
/*
*
* request.getRequestURL() 返回全路径
request.getRequestURI() 返回除去host(域名或者ip)部分的路径
request.getContextPath() 返回工程名部分,如果工程映射为/,此处返回则为空
request.getServletPath() 返回除去host和工程名部分的路径
*/
String uri=request.getRequestURI();
/*首先对于登录页面我们是可以直接进行访问的,假如没有登录,则判断是否已经登录,即session
是否有值,没有值则不允许访问
*/
if(!uri.endsWith("register.do")&&!uri.endsWith("login.jsp")&&!uri.endsWith("login.do")&&
!uri.endsWith(request.getContextPath()) && !uri.endsWith(request.getContextPath() + "/")){
//下一步想要访问非登录页面,则判断session是否有值
Object loginUser=request.getSession().getAttribute("user");
if(loginUser!=null){
//让他访问
chain.doFilter(req, res);
}else{
//不满足条件,则返回登录页面
String url = request.getRequestURL().toString();
response.sendRedirect(request.getContextPath() + "/system/login.jsp?returnURL=" + url);
}
}else{
chain.doFilter(req, res);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
chain.doFilter significa que a solicitação foi aprovada.Aqui, eu não configurei uma lista de permissões por conveniência, e usei diretamente para julgamento.