看到篇博文,是关于单点登录的。
[quote]编写你自己的单点登录(SSO)服务:[url]http://blog.csdn.net/javachannel/article/details/752437[/url][/quote]
根据这个博文,自己动手尝试了一下这种单点登录解决方案,当然,这个解决方案有个缺陷,就是有个前提,应用必须能够共享cookie。
记下思路,作为备忘。
1、关于cookie的设置。cookie使用了setDomain和setPath,这样才能保证这个cookie能被所有应用共享。
[quote]1.可在同一应用服务器内共享方法:设置cookie.setPath("/");
2.跨域共享cookie的方法:设置cookie.setDomain(".jszx.com"),这个参数必须以“.”开始。 ; [/quote]
2、用cookie来保存用户已登录的状态。在注销用户时,把该cookie设置过期,当然,也要使用setDomain和setPath。
3、使用了三个web project来做练习,一个作为登录验证系统,另外两个应用系统,代码基本相同。应用系统配置filter来过滤访问请求。
过滤器代码
登录验证系统的登录代码
[quote]编写你自己的单点登录(SSO)服务:[url]http://blog.csdn.net/javachannel/article/details/752437[/url][/quote]
根据这个博文,自己动手尝试了一下这种单点登录解决方案,当然,这个解决方案有个缺陷,就是有个前提,应用必须能够共享cookie。
记下思路,作为备忘。
1、关于cookie的设置。cookie使用了setDomain和setPath,这样才能保证这个cookie能被所有应用共享。
[quote]1.可在同一应用服务器内共享方法:设置cookie.setPath("/");
2.跨域共享cookie的方法:设置cookie.setDomain(".jszx.com"),这个参数必须以“.”开始。 ; [/quote]
2、用cookie来保存用户已登录的状态。在注销用户时,把该cookie设置过期,当然,也要使用setDomain和setPath。
3、使用了三个web project来做练习,一个作为登录验证系统,另外两个应用系统,代码基本相同。应用系统配置filter来过滤访问请求。
过滤器代码
public class UserFilter implements Filter {
private static String loginUrl = "";
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
if (isCookieLogined(req)) {
chain.doFilter(request, response);
} else {
String fromUrl = req.getRequestURL().toString();
resp.sendRedirect(loginUrl + "?fromUrl=" + fromUrl);
}
}
public void init(FilterConfig filterConfig) throws ServletException {
loginUrl = filterConfig.getServletContext().getInitParameter("loginUrl");
}
private boolean isCookieLogined(HttpServletRequest req) {
Cookie[] cookies = req.getCookies();
if(cookies!=null){
for (Cookie cookie : cookies) {
if (cookie.getName().equals("user")&&cookie.getValue()!=null) {
//TODO:此处应该调用auth的cookie验证方法
return true;
}
}
}
return false;
}
}
登录验证系统的登录代码
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = -8212504322196762878L;
private static ConcurrentMap<String, String> userMap = new ConcurrentHashMap<String, String>();
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String fromUrl = request.getParameter("fromUrl");
request.setAttribute("fromUrl", fromUrl);
request.getRequestDispatcher("index.jsp").forward(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String user = request.getParameter("user");
if(this.isRegister(user)){
this.saveCookie(user, response);
String fromUrl = request.getParameter("fromUrl");
response.sendRedirect(fromUrl);
}
}
@Override
/**
* 初始化数据
*/
public void init() throws ServletException {
userMap.put("cevin", "cevin");
userMap.put("aki", "aki");
}
private boolean isRegister(String user){
if(userMap.get(user)!=null){
return true;
}
return false;
}
private void saveCookie(String user, HttpServletResponse response){
Cookie cookie = new Cookie(CommonUtils.COOKIE_USER, user);
cookie.setDomain(getServletContext().getInitParameter("domain"));
cookie.setMaxAge(Integer.parseInt(getServletContext().getInitParameter("cookieLife")));
cookie.setPath("/");
response.addCookie(cookie);
}
}