上下文
过滤器控制登录
写一个过滤器,根据控制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;
}
}