实现登录控制的几种方法【在 《再识spring(mybatis)》基础上】【获取上下文路径/请求全路径】

22 篇文章 0 订阅
11 篇文章 0 订阅

上下文

过滤器控制登录

写一个过滤器,根据控制URL进行过滤

import java.io.IOException;

import javax.mail.Session;
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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionContext;

import com.sun.org.apache.bcel.internal.generic.GETSTATIC;

public class UserLoginFilter implements Filter {
    String strCheck = null;

    @Override
    public void destroy() {
	// TODO Auto-generated method stub

    }

    @Override
    public void doFilter(ServletRequest paramServletRequest,
	    ServletResponse paramServletResponse, FilterChain paramFilterChain)
	    throws IOException, ServletException {
	
	if (strCheck.equals("notcheck")) {
	   paramFilterChain.doFilter(paramServletRequest, paramServletResponse);
	    return;
	}
	
	String contextPath = ((HttpServletRequest) paramServletRequest)
		.getContextPath();
	String requestUri = ((HttpServletRequest) paramServletRequest)
		.getRequestURI();
	//System.out.println(contextPath);
	System.out.println(requestUri);
	String strLogin=(String) ((HttpServletRequest)paramServletRequest).getSession().getAttribute("isLogin");
	System.out.println("登录状态:"+strLogin);
	
	if (!(  requestUri.contains("index.htm") || requestUri.contains("process.jsp") )  )
	    if ( strLogin == null) {
		System.out.println("no login");
		((HttpServletResponse) paramServletResponse).sendRedirect(contextPath + "/index.htm");
		return;
	    }
	System.out.println("dofilter");
	paramFilterChain.doFilter(paramServletRequest, paramServletResponse);
    }

    @Override
    public void init(FilterConfig paramFilterConfig) throws ServletException {
	// TODO Auto-generated method stub
	strCheck = paramFilterConfig.getInitParameter("checklogin");
	
    }

}

 

SPRING拦截器控制登录(类似过滤器控制登录)

代码

package com.xny.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class AuditingInterceptor extends HandlerInterceptorAdapter {
   Logger logger = Logger.getLogger(AuditingInterceptor.class);

   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
         throws Exception {
      String currentPath = request.getRequestURI();
      String queryString = request.getQueryString();
      queryString = queryString == null ? "" : "?" + queryString;
      logger.info(currentPath + queryString);
      String isLogin=(String) request.getSession().getAttribute("islogin");
      
      if (isLogin == null) {
         currentPath = request.getServletContext().getContextPath();
         response.sendRedirect(currentPath + "/user/login.action");
         return false;
      }
      return true;
   }

}

配置

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />       
        <mvc:exclude-mapping path="/user/login.php" />           
        <bean class="com.springmy.interceptor.AuditingInterceptor">
        </bean>
    </mvc:interceptor>
</mvc:interceptors>

代码中控制登录

代码

	@RequestMapping(value = "/insert", method = RequestMethod.GET)
	public String insert(HttpServletRequest request,HttpServletResponse resp) throws IOException {
		System.out.println("goto insertUI............");
		String isLogin = (String) request.getSession().getAttribute("islogin");
		if (isLogin == null || isLogin.equals("no")) {
			request.setAttribute("ts", "not login!");
            return "loginUse";
		}		
		return "insertPny";
		
	}

 效果

 

 

AOP控制登录

代码(注释)

	@RequestMapping(value = "/insert", method = RequestMethod.GET)
	public String insert(HttpServletRequest request,HttpServletResponse resp) throws IOException {
		System.out.println("goto insertUI............");
//		String isLogin = (String) request.getSession().getAttribute("islogin");
//		if (isLogin == null || isLogin.equals("no")) {
//			request.setAttribute("ts", "not login!");
//            return "loginUse";
//		}		
		return "insertPny";
		
	}

 切面

package com.springmy.aop;

import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

public class TestAop {

	Logger logger = Logger.getLogger(TestAop.class);
	public Object AdviceA(ProceedingJoinPoint pjp) throws Throwable {
		String classAndMethod = pjp.getTarget().getClass().getName() + "类的" + pjp.getSignature().getName();
		logger.debug("AdviceA:" + classAndMethod + "方法开始执行!");
		System.out.println("AdviceA:" + classAndMethod + "方法开始执行!");	
		HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
				.getRequest();
//		HttpServletResponse resp = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
//				.getResponse();
		String isLogin = (String) request.getSession().getAttribute("islogin");
		if (isLogin == null || isLogin.equals("no")) {
			request.setAttribute("ts", "aop not login!");
			return "loginUse";
		} else {
			return pjp.proceed();
		}
	}
}

 配置文件

<aop:aspectj-autoproxy proxy-target-class="true" />
<bean id="testAop" class="com.springmy.aop.TestAop" />
<aop:config>   
    <aop:aspect id="testAop" ref="testAop">        
        <aop:pointcut id="logpointcut"
                      expression="execution(String com.springmy.controller.PnyController.*(..))"   />
         <aop:around pointcut-ref="logpointcut" method="AdviceA" /> 
    </aop:aspect>     
</aop:config>

 效果

AOP注解方式

package com.htmlspring.aop;

import org.apache.log4j.Logger;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class LogAspect {

	Logger log = Logger.getLogger(LogAspect.class);

	@Pointcut("execution(* com.htmlspring.service.FldServiceImpl.getAll(..))")
	public void aop() {	}

	// 此方法将用作前置通知
	@Before(value = "aop()")
	public void BeforeAdvice(JoinPoint joinpoint) {
		String classAndMethod = joinpoint.getTarget().getClass().getName() + "类的" + joinpoint.getSignature().getName();
		log.info("前置通知:" + classAndMethod + "方法开始执行!");
	}

	// 此方法将用作后置通知
	@AfterReturning(value = "aop()")
	public void AfterReturningAdvice(JoinPoint joinpoint) {
		String classAndMethod = joinpoint.getTarget().getClass().getName() + "类的" + joinpoint.getSignature().getName();
		log.info("后置通知:" + classAndMethod + "方法执行正常结束!");
	}

	// 此方法将用作异常通知
	@AfterThrowing(value = "aop()", throwing = "e")
	public void AfterThrowingAdvice(JoinPoint joinpoint, Throwable e) {
		String classAndMethod = joinpoint.getTarget().getClass().getName() + "类的" + joinpoint.getSignature().getName();
		log.info("异常通知:" + classAndMethod + "方法抛出异常:" + e.getMessage());
	}

	// 此方法将用作最终通知
	@After("aop()")
	public void AfterAdvice(JoinPoint joinpoint) {
		String classAndMethod = joinpoint.getTarget().getClass().getName() + "类的" + joinpoint.getSignature().getName();
		log.info("最终通知:" + classAndMethod + "方法执行结束!");
	}

	// 此方法将用作环绕通知
	@Around("aop()")
	public Object AroundAdvice(ProceedingJoinPoint pjp) throws Throwable {
		long begintime = System.currentTimeMillis();// 记下开始时间
		// 传递给连接点对象进行接力处理
		Object result = pjp.proceed();
		long endtime = System.currentTimeMillis();// 记下结束时间
		String classAndMethod = pjp.getTarget().getClass().getName() + "类的" + pjp.getSignature().getName();
		log.info("环绕通知:" + classAndMethod + "方法执行结束,耗时" + (endtime - begintime) + "毫秒!");
		return result;
	}
}

EL

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值