spring security 3 实现异步登录
1》 实现过滤器
/**
*
*/
package ******************;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
import org.springframework.security.web.context.HttpSessionContextIntegrationFilter;
import org.springframework.web.filter.OncePerRequestFilter;
import flexjson.JSONSerializer;
/**
* function:
*
* @author LJ
*
*/
public class LoginAjaxFilter extends OncePerRequestFilter {
private static final Logger log = LoggerFactory
.getLogger(LoginAjaxFilter.class);
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// 检查提交的变量中是否有ajax请求的变量,如果没有,则不是ajax的登录请求,则走默认的请求。
if (!isAjaxRequest(request)) {
filterChain.doFilter(request, response);
return;
}
log.debug("AjaxSecurityFilter: Processing an AJAX call : "
+ request.getRequestURL());
RedirectResponseWrapper redirectResponseWrapper = new RedirectResponseWrapper(
response);
filterChain.doFilter(request, redirectResponseWrapper);
Map<String, String> map = new HashMap<String, String>();
if (redirectResponseWrapper.getRedirect() != null) {
String redirectURL = redirectResponseWrapper.getRedirect();
HttpSession httpSession = request.getSession();
if (redirectURL.indexOf("login") != -1) {
// populate your reply in this case the json object
// with what ever information needed to pop up your login window
if (redirectURL.indexOf("login_error=1") != -1) {
// 登录失败
map.put("success", "false");
}
}
// / your auth is successful the call is successful
else {
// you can return the user name and password in the reply so it
// can be displayed for example in you app
SecurityContext ctx = (SecurityContext) httpSession
.getAttribute(HttpSessionContextIntegrationFilter.SPRING_SECURITY_CONTEXT_KEY);
if (ctx != null) {
Authentication auth = ctx.getAuthentication();
UserDetails user = (UserDetails) auth.getPrincipal();
if (user != null) {
map.put("username", user.getUsername());
map.put("success", "true");
} else {
// 登录失败
map.put("success", "false");
map.put("errorMsg", "error");
}
} else {
map.put("success", "false");
}
}
try {
String outString = new JSONSerializer().serialize(map);
log.debug("jsonString : "+outString);
response.getWriter().write(outString);
} catch (Exception e) {
log.error("{}",e.getMessage());
}
}
}
/**
* @param request
* the request object
* @return true if this request is an ajax request. This is determined by a
* configured name/value pair that is applied to the request header
*/
protected boolean isAjaxRequest(HttpServletRequest request) {
// test with our ajax request pairs
String ajax = request.getParameter("ajax");
if ("".equals(ajax) || ajax == null) {
return false;
}
return true;
}
protected class JsonFlag{
String success;
public String getSuccess() {
return success;
}
public void setSuccess(String success) {
this.success = success;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
String username;
}
}
2》 web.xml
<!-- 异步登录过滤器 filter -->
<filter>
<filter-name>loginAjaxFilter</filter-name>
<filter-class>com.book511.app.web.login.LoginAjaxFilter</filter-class>
</filter>
<!-- 乱码处理 放置第一位filter-mapping -->
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 异步登录过滤器 map -->
<filter-mapping>
<filter-name>loginAjaxFilter</filter-name>
<url-pattern>/j_spring_security_check</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
3 》 ajaxLogin.js
//弹出窗口
function openLoginDiv(){
var htl = "<div id='loginFormDiv'><span class='span_error' id='login_error'></span><a href='javascript:void(0);' onclick='closeDiv();'>关闭窗口</a><form action='##' method='post'><table>"
+ "<tr><td colspan='2'><span style='color:#FF0000;' id='login_error'></span></td></tr>"
+ "<tr><td class='td_name'>用户名:</td><td class='td_text'><input type='text' name='j_username' id='j_username' /></td></tr>"
+ "<tr><td class='td_name'>密码:</td><td class='td_text'><input type='password' name='j_password' id='j_password' /></td></tr>"
+ "<tr><td colspan='2' class='td_but'><input type='button' id='login_button' onclick='doLogin();' value='登录' /></td></tr>"
+ "</table></form></div><div id='bg' class='bg' style='display: none;'></div>"+
"<iframe id='popIframe' class='popIframe' frameborder='0'></iframe>";
if (!$(".loginDiv").hasClass(
"loginDiv")) {
//alert(htl);
// 动态写一个div弹出层
$("<div>", {
"class" : "loginDiv",
"id":"loginDiv"
}).append(htl).appendTo("body");
}
document.getElementById('popIframe').style.display = 'block';
document.getElementById('bg').style.display = 'block';
}
// 关闭窗口
function closeDiv(){
$("#loginDiv").remove();
document.getElementById('bg').style.display='none';
document.getElementById('popIframe').style.display='none';
window.location.reload(true);
}
//登录操作
function doLogin(){
var j_username = $("#j_username").val();
var j_password = $("#j_password").val();
var redirectURL = location.href;
$.ajax({
type : "POST",
url : "/app/j_spring_security_check",
data : "j_username="
+ j_username
+ "&j_password="
+ j_password
+ "&ajax=ajax"+ "&redirectURL="+redirectURL,
success : function(msg) {
eval("var jsonObj="+ msg);
if (jsonObj.success == "true") {
// 如果登录成功,则跳转到。
alert("登录成功");
window.location.reload(true);
//closeDiv();
//alert(111);
} else if (jsonObj.success = "false") {
// 写入登录失败信息
var errors = "对不起,用户名或密码不正确!";
$("#login_error").html(errors);
}
}
});
}
4 》
相关推荐
结束数据方法的参数,该如何定义?-- 集合为自定义实体类中的结合属性,有几个实体类,改变下标就行了。<input id="add" type="button" value="新增visitor&quo