我使用Struts1.x做示範:
1、建立兩個ActionBean,LoginAction負責使用者登陸(持久化cookie);LogoutAction負責退出登陸(删除cookie)
LoginAction code:
public class LoginAction extends Action {
private final int MAX_AGE = 14 * 24 * 60 * 60;
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DynaActionForm testForm = (DynaActionForm) form;// TODO Auto-generated
//
String id = testForm.getString("userName");
String password = testForm.getString("userPW");
//
if (true) {// 假設登入成功
Cookie idCookie = new Cookie("id", id); // 可以使用md5或着自己的加密算法儲存
Cookie passwordCookie = new Cookie("password", password);
idCookie.setPath("/"); // cookie路徑
idCookie.setMaxAge(MAX_AGE);
passwordCookie.setPath("/");
passwordCookie.setMaxAge(MAX_AGE);
//
response.addCookie(idCookie);
response.addCookie(passwordCookie);
//
User u = new User();
u.setUname(id);
u.setUpwd(password);
request.getSession().setAttribute("user", u);
return mapping.findForward("ok");
}
return mapping.findForward("back");
}
}
LogoutAction code:
public class logoutAction extends Action {
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
DynaActionForm testForm = (DynaActionForm) form;// TODO Auto-generated
//
request.getSession().invalidate();
Cookie idCookie = new Cookie("id", "");
Cookie passwordCookie = new Cookie("password", "");
idCookie.setMaxAge(0); // 使cookie失效
passwordCookie.setMaxAge(0);
idCookie.setPath("/"); // 這個不能少
passwordCookie.setPath("/");
response.addCookie(idCookie);
response.addCookie(passwordCookie);
//
return mapping.findForward("ok");
}
}
2、在儲存完cookie後要保證以後使用者每次通路該系統的任意頁面系統都必須先通路使用者的cookie檢視是否有登陸資訊,這個使用servlet的filter實作最為友善。
Filter code:
public class doFilterProcessing implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
private void doBeforeProcessing(ServletRequest request) {
HttpSession session = ((HttpServletRequest) request).getSession(true);
// 首先檢查session,若已經登陸則直接忽略一下代碼
if (session.getAttribute("user") != null) {
return;
}
Cookie[] cookies = ((HttpServletRequest) request).getCookies();
String id = null;
String password = null;
if (cookies != null) {
for (Cookie c : cookies) {
if (c.getName().equals("id")) {
id = c.getValue();
}
if (c.getName().equals("password")) {
password = c.getValue();
}
}
}
if (validateUser(id, password)) { // 驗證使用者密碼和id
session = ((HttpServletRequest) request).getSession(true);
User u = new User();
u.setUname(id);
u.setUpwd(password);
session.setAttribute("user", u);
}
}
private Boolean validateUser(String id, String password) {
if (id == null || password == null) {
return false;
}
return true;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
doBeforeProcessing(request);
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
配置web.xml
<filter>
<filter-name>FilterProcessing</filter-name>
<filter-class>com.struts.doFilterProcessing</filter-class>
</filter>
<filter-mapping>
<filter-name>FilterProcessing</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
最後寫一個jsp腳本,如果cookie存在則跳過登入界面
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%
Object x = request.getSession().getAttribute("user");
if (x != null) {
response.sendRedirect("ok.jsp");
return;
}
%>