把这些内容记录下来,以后可以拿过来就用。
我做的这个功能是在登录时点选自动登录的checkbox,当登录成功能后会在本地生成一个cookie记录用户数据,以便下次用户不用再次登录。
项目整体的框架才用的是ssh2,这里我还用到了filter,每一个网页请求都会被filter拦截到,这样在filter中把cookie从本地取出,然后把取出的用户数据和数据库验证返回结果,如果验证成功,将用户数据保存到seession中,如果没有验证成功就执行chain.doFilter(request, response);往下继续执行。
还有很多实现的filter方法,spring security这个框架很好的实现了对用户登录权限的管理。但我唯一只用到了filter实现成功了,以后在研究其他的吧。
首先,加入filter的话就要在web.xml中配置filter。
<filter>
<filter-name>MySpringFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><!--这是一个代理filter的类-->
<init-param>
<param-name>targetBeanName</param-name>
<param-value>cookieLoginFilter</param-value><!--代理类代理了filter之后会通过<span style="font-family: Arial, Helvetica, sans-serif;">cookieLoginFilter去spring中找到对应的bean</span>-->
</init-param>
</filter>
<filter-mapping>
<filter-name>MySpringFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
<p> </filter-mapping></p>
这里要讲一下,web.xml中为什么filter的信息要这么配置呢,这样配置是为了让spring来管理这个filter,这样filter在执行时service也被spring注入了,如果不用spring管理的话,当filter执行时spring管理的bean像service啊,sessionFactory啊都没有被注入,这样就无法访问数据库来验证用户。 这里要说filter是依赖于servlet容器的。
@Override
public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
// 获取到session中用户对象
Object object = request.getSession().getAttribute(CommonConstants.SESSION_USER);
String email = null;
String password = null;
String autoStatus = null;
// 判断如果object等于空 session中没有用户
if (object == null) {
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
// 判断Cookie的邮箱名是否等于"HKPhotoUserEmail"
if (CommonConstants.BROWSER_COOKIE_EMAIL.equals(cookie.getName())) {
email = cookie.getValue().trim();
}
// 判断Cookie的密码名是否等于"HKPhotoUserPassword"
if (CommonConstants.BROWSER_COOKIE_PASSWORD.equals(cookie.getName())) {
password = cookie.getValue().trim();
}
// 判断Cookie的自动登录状态名是否等于"HKPhotoAutoLoginStatus"
if (CommonConstants.BROWSER_COOKIE_AUTO_STATUS_NAME
.equals(cookie.getName())) {
autoStatus = cookie.getValue().trim();
}
}
if (autoStatus != null && autoStatus.equals("1")) {
if (email != null && password != null && email.length() > 0
&& password.length() > 0) {
vlUser = new VLUser();
vlUser.setUEmail(email);
vlUser.setUPwd(password);
vlUser = vlUserServiceImpl.searchUser(vlUser).get(0);
if (vlUser != null) {
// 将该user放入到session中
request.getSession().setAttribute(CommonConstants.SESSION_USER, vlUser);
chain.doFilter(request, response);//这句是继续执行下面的filter
} else {
chain.doFilter(request, response);
}
} else {
chain.doFilter(request, response);
}
} else {
chain.doFilter(request, response);
}
} else {
chain.doFilter(request, response);
}
} else {
chain.doFilter(request, response);
}
}
给出filter中doFilter的代码,init()和destroy()中没有内容。
public void addCookieingUserToResponse(VLUser vlUser) {
// 设置cookie邮箱名值对
Cookie cookieEmail = new Cookie(CommonConstants.BROWSER_COOKIE_EMAIL,vlUser.getUEmail());
cookieEmail.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
cookieEmail.setPath("/");
RequestAndResponse.getResponse().addCookie(cookieEmail);
// 设置cookie密码名值对
Cookie cookiePassword = new Cookie(CommonConstants.BROWSER_COOKIE_PASSWORD, vlUser.getUPwd());
cookiePassword.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
cookiePassword.setPath("/");
RequestAndResponse.getResponse().addCookie(cookiePassword);
// 设置cookie自动登录状态名值对
Cookie autoLoginStatusCookie = new Cookie(
CommonConstants.BROWSER_COOKIE_AUTO_STATUS_NAME,
"1");
autoLoginStatusCookie
.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
autoLoginStatusCookie.setPath("/");
RequestAndResponse.getResponse().addCookie(autoLoginStatusCookie);
// 设置cookie登出名值对
Cookie loginOutCookie = new Cookie(CommonConstants.BROWSER_COOKIE_LOGIN_OUT_NAME,"0");
loginOutCookie.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
loginOutCookie.setPath("/");
RequestAndResponse.getResponse().addCookie(loginOutCookie);
}
public void removeCookieingUserInResponse(){
System.out.println("removeCookie");
// 设置cookie邮箱名值对
Cookie cookieEmail = new Cookie(CommonConstants.BROWSER_COOKIE_EMAIL,null);
cookieEmail.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
cookieEmail.setPath("/");
RequestAndResponse.getResponse().addCookie(cookieEmail);
// 设置cookie密码名值对
Cookie cookiePassword = new Cookie(CommonConstants.BROWSER_COOKIE_PASSWORD, null);
cookiePassword.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
cookiePassword.setPath("/");
RequestAndResponse.getResponse().addCookie(cookiePassword);
// 设置cookie自动登录状态名值对
Cookie autoLoginStatusCookie = new Cookie(CommonConstants.BROWSER_COOKIE_AUTO_STATUS_NAME,"0");
autoLoginStatusCookie.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
autoLoginStatusCookie.setPath("/");
RequestAndResponse.getResponse().addCookie(autoLoginStatusCookie);
// 设置cookie登出名值对
Cookie loginOutCookie = new Cookie(CommonConstants.BROWSER_COOKIE_LOGIN_OUT_NAME,"0");
loginOutCookie.setMaxAge(CommonConstants.BROWSER_COOKIE_MAX_AGE);
loginOutCookie.setPath("/");
RequestAndResponse.getResponse().addCookie(loginOutCookie);
}
cookie的代码也很简单
我觉得主要是web.xml那块需要记录下来,因为spring管理filter的配置那块和以前的filter不太一样,让我找了好一段时间。