# 一行代码解决的问题

&nbsp;

<blockquote>
  人活久了什么鸟都能见到，代码敲久了什么问题都能见到。问题产生后总有些惰性，懒得去改。到头来却是非不为也，实不知也。知道了其实也就是一行代码的事儿。
</blockquote>

前段时间做了一个登陆功能，本来以为是手到擒来的小活，没怎么放到心上，但真正用起来细节问题处理的实在粗糙。
功能很简单，就是常见的登陆，但是不使用session，改用redis缓存记录登陆标识。
遇到的问题，不再这细说了，大多是项目中特殊情况引起的。在此单表一例。登陆后跳转到登陆前的页面。

<h2>第一版代码如下：</h2>

<pre><code class="java">private void jumpLoginPage(HttpServletRequest request,HttpServletResponse response) throws IOException{
String redirectUrl = request.getRequestURL().toString();
String queryString = request.getQueryString();
if(null!=queryString){
redirectUrl = URLEncoder.encode(redirectUrl+"?"+queryString, "UTF-8");
}
response.sendRedirect(loginUrl+"?redirectUrl="+redirectUrl);
}
</code></pre>

五分钟写完，提交svn，然后愉快的去大群水了。

第二天，就有人开始发现问题了：

<blockquote>
  登陆成功，停留在一个页面，当登陆标识失效后，点击页面的按钮发送<strong>post</strong>请求,请求被拦截后跳转到登陆页面，输入账号，密码，点击登陆，登陆成功跳转到之前页面（此处应为跳转的之前的请求，即点击按钮发送的请求），然后。。。。悲剧了，由于改请求只支持post方式，所以400错误。
</blockquote>

<h2>修改，第二版代码</h2>

<pre><code class="java">private void jumpLoginPage(HttpServletRequest request,HttpServletResponse response) throws IOException{
String redirectUrl = request.getHeader("Referer");
response.sendRedirect(loginUrl+"?redirectUrl="+redirectUrl);
}
</code></pre>

然后，愉快的去水了。。。

第三天

<blockquote>登录成功后跳转的是之前停留的页面，而不是请求的页面</blockquote>

<h2>修改，第三版代码</h2>

<pre><code><br />private void jumpLoginPage(HttpServletRequest request,HttpServletResponse response) throws IOException{

String redirectUrl = request.getHeader("referer");
String requestUrl = request.getRequestURL().toString();
if(isAjax(request) || !"get".equalsIgnoreCase(request.getMethod())){
response.sendRedirect(loginUrl+"?redirectUrl="+redirectUrl);
}else{
redirectUrl = requestUrl;
String queryString = request.getQueryString();
if(null!=queryString){
redirectUrl = redirectUrl+"?"+queryString;
}
redirectUrl = URLEncoder.encode(redirectUrl, "UTF-8");
response.sendRedirect(loginUrl+"?redirectUrl="+redirectUrl);
return;
}
}

</code></pre>

非get类型的请求及ajax请求跳转到refer的页面，其他的跳转到请求的页面

然后，还能愉快的水会儿吗？
