[Centenas de vitórias] Sanchuang Competition-Interceptor and Filter para realizar o registro e o login (o estado sem login não pode acessar outras páginas)

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:
Insira a descrição da imagem aqui
Página de registro:
Insira a descrição da imagem aqui

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.

Publicado 24 artigos originais · elogiado 4 · visitas 2038

Acho que você gosta

Origin blog.csdn.net/weixin_44226263/article/details/105243471
Recomendado
Clasificación