请教一个在MVC模式下获取访问者IP的实现方法 5C

有这样一个需求,很简单,就是用户访问网页时,获取到用户的IP,并写入数据库。
以前用model1模式开发时,很容易实现,就是在JSP中用request.getRemoteAddr()获取用户IP地址后,调用一个bean中的方法(将刚才获取的IP作为参数),直接写入数据库就可以了。
但现在用MVC模式开发,那么写入数据库的操作都在DAO层实现,是JSP-->SERVLET-->SERVICE-->DAO这种调用关系,也就是理论上JSP不能直接调用DAO中的写入数据库操作了(也不能直接调用SERVICE),而是要通过调用SERVLET来间接实现。
那么难道是在JSP加载页面时,在js的onload中调用SERVLET(SERVLET-->SERVICE-->DAO)来实现将用户IP写入数据库的操作吗?
请大神指点,谢谢!

3个回答

可以用 Filter ,定义一个 Filter 完成相关的操作。

u014717505
aaaffaewrerewrwer 下面的话,需要倒着看。CSDN弄的这个回复功能真不太好
7 个月之前 回复
u014717505
aaaffaewrerewrwer 回复: 来实现将用户信息写入数据库,最后,在SERVLET中再跳转到用户要去的JSP,这样逻辑比较好些呢?
7 个月之前 回复
u014717505
aaaffaewrerewrwer 回复Blank丶夜: 其实,我是对MVC模式下,实现这个功能的流程有点疑问。是不是应该是用户直接先访问一个SERVLET,在这个SERVLET中用request.getHeader之类的方法获得访问者信息,然后调用SERVICE
7 个月之前 回复
u014717505
aaaffaewrerewrwer 回复Blank丶夜: 那么难道是在JSP加载页面时,在js的onload中调用SERVLET(SERVLET-->SERVICE-->DAO)来实现把JSP中用request.getRemoteAddr()获取的用户IP写入数据库的操作吗?总觉得有点怪怪的
7 个月之前 回复
qq_33839973
Blank丶夜 不是很理解。你分析的很清楚啊。JSP-->SERVLET-->SERVICE-->DAO。在JSP获取数据传给service,再通过service调用dao。这不是正常的逻辑吗。
7 个月之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 正确
7 个月之前 回复

兄台可以看看dwr框架,也许能够帮助你实现你想要的问题

/**
* 通过HttpServletRequest返回IP地址
* @param request HttpServletRequest
* @return ip String
* @throws Exception
/
public String getIpAddr(HttpServletRequest request) throws Exception {
String ip = request.getHeader("x-forwarded-for");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}
/
*
* 通过IP地址获取MAC地址
* @param ip String,127.0.0.1格式
* @return mac String
* @throws Exception
*/
public String getMACAddress(String ip) throws Exception {
String line = "";
String macAddress = "";
final String MAC_ADDRESS_PREFIX = "MAC Address = ";
final String LOOPBACK_ADDRESS = "127.0.0.1";
//如果为127.0.0.1,则获取本地MAC地址。
if (LOOPBACK_ADDRESS.equals(ip)) {
InetAddress inetAddress = InetAddress.getLocalHost();
//貌似此方法需要JDK1.6。
byte[] mac = NetworkInterface.getByInetAddress(inetAddress).getHardwareAddress();
//下面代码是把mac地址拼装成String
StringBuilder sb = new StringBuilder();
for (int i = 0; i < mac.length; i++) {
if (i != 0) {
sb.append("-");
}
//mac[i] & 0xFF 是为了把byte转化为正整数
String s = Integer.toHexString(mac[i] & 0xFF);
sb.append(s.length() == 1 ? 0 + s : s);
}
//把字符串所有小写字母改为大写成为正规的mac地址并返回
macAddress = sb.toString().trim().toUpperCase();
return macAddress;
}
//获取非本地IP的MAC地址
try {
Process p = Runtime.getRuntime().exec("nbtstat -A " + ip);
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader br = new BufferedReader(isr);
while ((line = br.readLine()) != null) {
if (line != null) {
int index = line.indexOf(MAC_ADDRESS_PREFIX);
if (index != -1) {
macAddress = line.substring(index + MAC_ADDRESS_PREFIX.length()).trim().toUpperCase();
}
}
}
br.close();
} catch (IOException e) {
e.printStackTrace();
}
return macAddress;
}

admin19921022
宁内疚不迁就 回复aaaffaewrerewrwer: 当然可以那么搞啊,最简单的通过后台获取当前用户的IP,直接存入数据库不就好了
7 个月之前 回复
u014717505
aaaffaewrerewrwer 感谢回答,取得用户IP地址并不难,无论是model1还是MVC模式,都可以在JSP中用request.getRemoteAddr()获取用户IP。我想问的是,在MVC模式下,在JSP中获得IP后,难道是调用SERVLET,然后通过SERVLET调用SERVICE和DAO,去实现把JSP中获得的IP写入数据库吗?
7 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐